package gui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.net.URL;

import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

/** Il SecondaryMenu è quel pannello dell'Editor che compare solo
 *  dopo aver selezionato una delle opzioni nel PrimaryMenu.
 * @author Daniele 
 * @version 1.3 */
public abstract class SecondaryMenu extends JPanel {
	
	private static final long serialVersionUID = -8381434561622845736L;
	
	// Scritte e info sui pulsanti AddToMap, Ok e Cancel.
	protected static final String TXT_ADD = "Add to Map";
	protected static final String TXT_OK = "Ok";
	protected static final String TXT_CANCEL = "Cancel";
	protected static final URL DESC_ADD = SecondaryMenu.class.getResource("addToMapDESC.html");
	protected static final URL DESC_OK = SecondaryMenu.class.getResource("OkDESC.html");
	protected static final URL DESC_CANCEL = SecondaryMenu.class.getResource("CancelDESC.html");
	
	/** Altezza preferita per il pannello descrittivo del SecondaryMenu. */
	protected static final int DESC_LABEL_HEIGHT = 150;
	
	/** Il GridBagLayout utilizzato per disporre i componenti.*/
	protected GridBagLayout layout;
	/** I constraints associati al GridBagLayout. */
	protected GridBagConstraints constraints;
	/** L'etichetta che contiene la descrizione esplicativa. */
	protected JScrollPane descriptionLabelScrollPane;
	/** La descrizione esplicativa delle opzioni nel pannello. */
	protected TextPanel descriptionLabel;
	/** Il JScrollPane relativo alla descrizione esplicativa. */
	protected String description;
	/** rappresenta il pulsante di aggiunta alla mappa. */
	protected DescribedCustomizedButton addToMapButton;
	/**rappresenta il pulsante di conferma del menu*/
	protected DescribedCustomizedButton okButton;
	/**rappresenta il pulsante annulla del menu*/
	protected DescribedCustomizedButton cancelButton;
	
	/** Costruisce un generico SecondaryMenu. */
	public SecondaryMenu(){
		super();
		this.setOpaque(false);
		layout = new GridBagLayout();
		constraints = new GridBagConstraints();
		this.setLayout(layout);
	}
	
	/** Metodo che riassume le operazioni necessarie per registrare un
	 *  componente nel SecondaryMenu, in accordo con il GridBagLayout.
	 * @param c			   il componente da registrare.
	 * @param x			   il parametro gridx di GridBagConstraints.
	 * @param y			   il parametro gridy di GridBagConstraints.
	 * @param weighty	   il parametro weighty di GridBagConstraints.
	 * @param top_inset    il parametro inset.top di GridBagConstraints.
	 * @param bottom_inset il parametro inset.bottom di GridBagConstraints.
	 * @param gridwidth    il parametro gridwidth di GridBagConstraints. */
	protected void addComponentToLayout(JComponent c, int x, int y, double weighty, int top_inset, int bottom_inset, int gridwidth){
		constraints.gridx = x;
		constraints.gridy = y;
		constraints.weightx = 1;
		constraints.weighty = weighty;
		constraints.anchor = GridBagConstraints.CENTER;
		constraints.fill = GridBagConstraints.BOTH;
		constraints.insets.top = top_inset;
		constraints.insets.bottom = bottom_inset;
		constraints.insets.left = 10;
		constraints.insets.right = 10;
		constraints.gridheight = 1;
		constraints.gridwidth = gridwidth;
		layout.setConstraints(c, constraints);
		this.add(c, constraints);
	}
	
	/** Esegue tutte le operazioni necessarie per inizializzare
	 *  il JScrollPane relativo al pannello descrittivo del SecondaryMenu. */
	public void initializeJScrollPane(){
		this.descriptionLabelScrollPane = new JScrollPane(this.descriptionLabel);
		this.descriptionLabelScrollPane.setRowHeaderView(new ScrollCorner(Color.WHITE));
		this.descriptionLabelScrollPane.setCorner(JScrollPane.UPPER_RIGHT_CORNER, new ScrollCorner(Color.WHITE));
		this.descriptionLabelScrollPane.setBorder(BorderFactory.createLineBorder(Color.BLUE, 3, true));
	}
	
	public void paintComponent(Graphics g){
		Dimension size = this.getSize();
		RoundedBorder border = new RoundedBorder(Color.LIGHT_GRAY, Color.WHITE, 3, 40);
		border.paintBorder(this, g, 0, 0, size.width, size.height);
	}

	/** Getter per il pulsante di conferma (ok).
	 * @return the okButton. For further information visit {@link #okButton}*/
	public DescribedCustomizedButton getOkButton() {
		return okButton;
	}

	/** Getter per il pulsante annulla (cancel).
	 * @return the cancelButton. For further information visit {@link #cancelButton} */
	public DescribedCustomizedButton getCancelButton() {
		return cancelButton;
	}
	
	/** Getter per il pulsante di aggiunta.
	 * @return l'addToMapButton. */
	public DescribedCustomizedButton getAddToMapButton(){
		return addToMapButton;
	}
}
